package nige.volum.core;

import java.util.Vector;

import nige.volum.utils.Attente;

/**
 * Classe coeur du projet
 * @author Nicolas Genevaux
 *
 */
public class Governance extends Thread {
	
	/**
	 * Dossier qui contient le code source a scanner
	 */
	private String dossier = "";
	/**
	 * Description des differents langage 
	 * (volumetries)
	 */
	private Vector<Langage> langages = null;
	
	/**
	 * Constructeur de la classe
	 * @param folder Dossier a scanner
	 * @param resultExtensionT Vecteur des 
	 * resultats du scan (extension)
	 * @param resultLangageT Vecteur des 
	 * resultats du scan (langage)
	 * @param dirlan Repertoire avec les 
	 * descriptions de langage
	 */
	public Governance(String folder, 
			Vector<ResultExtLan> resultExtensionT,
			Vector<ResultExtLan> resultLangageT, 
			String dirlan) {
		langages = (new RecupLangages(dirlan)).
		recuperer(resultExtensionT,resultLangageT);
		dossier = folder;
	}
	
	/**
	 * Debut du thread de la classe
	 * Scan le dossier et boucle jusqu'a 
	 * ce que ce soit fini
	 */
	public void run() {
		ScanFile.fichierTotalScanne = 0;
		Attente.threadslances = 0;
		Attente.filesOpen = 0;
		// Verifie qu'il n'y est pas trop de thread lance
		while(Attente.threadslances>Attente.threadsmax) {
			Attente.perform(1000);
		}
		// Increment du thread
		Attente.threadslances++;
		// Lancement du scan de dossier
		ScanFolder sf = new ScanFolder(dossier,langages);
		sf.start();
		// Nombre sert a comparer avec
		// Ce qui est deja scanne
		int nombre = -10;
		// Comparaison pour connaitre quand c'est fini
		// (on considere que c'est termine quand
		// le nombre de fichiers scannes n'evolue plus)
		while(nombre != Attente.actionRealisee) {
			nombre = Attente.actionRealisee;
			Attente.perform(1000);
		}
		// Fin
		Attente.threadslances--;
	}
	
}
